﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using CC;

namespace RFMS
{
    public partial class BestellingOpnemen : Form
    {
        public BestellingOpnemen(string gebruikersnaam, string tafelnaam, string functie)
        {
            InitializeComponent();
            //FormBorderStyle = FormBorderStyle.None;
            //WindowState = FormWindowState.Maximized;
            //TopMost = true;
            Login login = new Login();
            login.Hide();
            labelNaam.Text = gebruikersnaam;
            labelTafel.Text = tafelnaam;
            this._tafelnaam = tafelnaam;
            this._gebruikersnaam = gebruikersnaam;
            this._functie = functie;
        }
        private Button _btn;
        public CC.CategorieBeheer _categorieBeheer;
        private List<List<string>> _lijstCategorieen;

        private SubcategorieBeheer _subcategorieBeheer;
        private List<List<string>> _lijstSubcategorrieen;

        private ArtikelBeheer _artikelBeheer;
        private List<List<string>> _lijstArtikelen;

        private  OrderBeheer _orderBeheer;
       
        private string _aantal;
   
        private double _totaalPrijs = 0.00;
        private string _gebruikersnaam;
        private string _tafelnaam;
        private BonPrinten _bonPrinten;
        private string _functie;

        private void BestellingOpnemen_Load(object sender, EventArgs e)
        {
            LaadFormGegevens();
        }

        public void LaadFormGegevens()
        {
            flowLayoutPanelCategorie.Controls.Clear();
            flowLayoutPanelProduct.Controls.Clear();
            flowLayoutPanelSubCategorie.Controls.Clear();
            _categorieBeheer = new CategorieBeheer();
            _subcategorieBeheer = new SubcategorieBeheer();
            _artikelBeheer = new ArtikelBeheer();
            _orderBeheer = new OrderBeheer();
            _bonPrinten = new BonPrinten();
            timerTijd.Enabled = true;
            CheckIfOrder();
            

            switch (_functie)
            {
                case "Serveerder":
                    buttonBonPrinten.Visible = false;
                    buttonFinancieel.Visible = false;
                    buttonAdmin.Visible = false;
                    break;
                case "Financieel":
                    buttonAdmin.Visible = false;
                    break;
            }

            _lijstCategorieen = _categorieBeheer.LijstVanCategorieen();
            _lijstArtikelen = _artikelBeheer.LijstVanProducten();
            foreach (List<string> s in _lijstCategorieen)
            {
                _btn = new Button();
                _btn.Name = s[1];
                _btn.Text = s[1];
                _btn.BackColor = Color.DodgerBlue;
                _btn.ForeColor = Color.White;
                _btn.Size = new System.Drawing.Size(104, 50);
                _btn.Click += btnCategorie_Click;
                flowLayoutPanelCategorie.Controls.Add(_btn);
            }
        }

        private void CheckIfOrder()
        {
            if (_orderBeheer.OnafgehandeldeOrder(_tafelnaam) == 0)
            {
                buttonBonPrinten.Enabled = false;
            }

            else
            {
                buttonBonPrinten.Enabled = true;
            }
        }

        void btnCategorie_Click(object sender, EventArgs e)
        {
            flowLayoutPanelSubCategorie.Controls.Clear();
            flowLayoutPanelProduct.Controls.Clear();
            _lijstSubcategorrieen = _subcategorieBeheer.LijstVanSubcategorieen((sender as Button).Name);

            foreach (List<string> s in _lijstSubcategorrieen)
            {
                _btn = new Button();
                _btn.Name = s[1];
                _btn.Text = s[1];
                _btn.BackColor = Color.LightGray;
                _btn.ForeColor = Color.Black;
                _btn.Size = new System.Drawing.Size(104, 50);
                _btn.Click += btnSubcategorie_Click;
                flowLayoutPanelSubCategorie.Controls.Add(_btn);
            }
        }

        void btnSubcategorie_Click(object sender, EventArgs e)
        {
            flowLayoutPanelProduct.Controls.Clear();
            List<List<string>> lijst = _artikelBeheer.LijstVanProducten((sender as Button).Name);

            foreach (List<string> s in lijst)
            {
                _btn = new Button();
                _btn.Name = s[1];
                _btn.Text = s[1];
                _btn.BackColor = Color.DodgerBlue;
                _btn.ForeColor = Color.Black;
                _btn.Size = new System.Drawing.Size(104, 50);
                _btn.Click += buttonArtikel_Click;
                flowLayoutPanelProduct.Controls.Add(_btn);
            }
        }

        private void buttonArtikel_Click(object sender, EventArgs e)
        {
            double aantalD = 0;
            double prijs = 0;
            if (string.IsNullOrEmpty(_aantal))
            {
                MessageBox.Show(@"Voer een aantal in");
            }

            else
            {
                aantalD = Convert.ToInt32(_aantal);
                _aantal = null;
                prijs = getPrijs((sender as Button).Name);
                string[] row = new string[] { aantalD.ToString(), (sender as Button).Name, (aantalD * prijs).ToString() };
                dataGridViewBestelling.Rows.Add(row);
                _totaalPrijs += (prijs*aantalD);
                labelTotaal.Text = _totaalPrijs.ToString();
                labelKeuzeAantal.Text = null;
            }
        }

        private double getPrijs(string naamArtikel)
        {
            double prijs = 0;
            foreach (List<string> s in _lijstArtikelen)
            {
                if (s[1] == naamArtikel)
                {
                    prijs = Convert.ToDouble(s[2]);
                }
            }
            return prijs;
        }

        private void buttonCijfer_Click(object sender, EventArgs e)
        {
            if ((sender as Button).Name != "correctie")
            {
                string naam = (sender as Button).Name;
                string crop = naam.Remove(0, 6);
                _aantal += crop;
                _aantal = _aantal.TrimStart('0');
                labelKeuzeAantal.Text = _aantal;
            }

            else
            {
                _aantal = null;
                labelKeuzeAantal.Text = null;
            }
        }     

        private void timerTijd_Tick(object sender, EventArgs e)
        {
            DateTime dt = DateTime.Now;
            String.Format("{0:d/M/yyyy HH:mm:ss}", dt);
            labelTijd.Text = dt.ToString();
        }

        private void buttonAdmin_Click(object sender, EventArgs e)
        {
            AdminScherm adminScherm = new AdminScherm(this);
            adminScherm.ShowDialog();
        }

        private int orderId;
        private List<List<string>> lijst;
        private void buttonInboeken_Click(object sender, EventArgs e)
        {
            orderId = 0;
            orderId = _orderBeheer.OnafgehandeldeOrder(_tafelnaam);
            lijst = new List<List<string>>();

            if (orderId == 0)
            {
                NieuweOrder nieuweOrder = new NieuweOrder(_tafelnaam);
                nieuweOrder.ShowDialog();
            }

            orderId = 0;
            orderId = _orderBeheer.OnafgehandeldeOrder(_tafelnaam);

            if (orderId != 0)
            {
                lijst = new List<List<string>>();
                for (int i = 0; i < dataGridViewBestelling.Rows.Count; i++)
                {
                    _orderBeheer.OrderInboeken(Convert.ToInt32(dataGridViewBestelling.Rows[i].Cells[0].Value), haalPrijsOpVanArtikel(dataGridViewBestelling.Rows[i].Cells[1].Value.ToString()), dataGridViewBestelling.Rows[i].Cells[1].Value.ToString(), orderId, _gebruikersnaam);
                    lijst.Add(new List<string> { dataGridViewBestelling.Rows[i].Cells[0].Value.ToString(), haalPrijsOpVanArtikel(dataGridViewBestelling.Rows[i].Cells[1].Value.ToString()).ToString(), dataGridViewBestelling.Rows[i].Cells[1].Value.ToString(), haalLocatieOpVanArtikel(dataGridViewBestelling.Rows[i].Cells[1].Value.ToString()) });
                }
            }
            dataGridViewBestelling.RowCount = 0;
            labelKeuzeAantal.Text = null;
            bool goed = _bonPrinten.BonVoorInboeken(lijst, _tafelnaam, _gebruikersnaam, orderId);
            CheckIfOrder();
            if (!goed)
            {
                MessageBox.Show(@"Er is geen order om te printen!");
            }

            else
            {
                MessageBox.Show(@"Naar printer verzonden.");
            } 
            
        }

        private double haalPrijsOpVanArtikel(string naam)
        {
            return _artikelBeheer.HaalPrijsOp(naam);
        }

        private string haalLocatieOpVanArtikel(string naam)
        {
            string locatie = "";
            foreach (List<string> s in _lijstArtikelen)
            {
                if (s[1] == naam)
                {
                    locatie = s[6];
                }
            }
            return locatie;
        }

        private void buttonBonPrinten_Click(object sender, EventArgs e)
        {
            if (check_Bestelling.Checked)
            {
                BonKlant _bonKlant = new BonKlant();
                int totaal = 0;

                foreach (var bon in _bonKlant.BonKlantPrinten(labelTafel.Text))
                {
                    totaal += Convert.ToInt32(bon[0]) * Convert.ToInt32(bon[2]);
                }

                LoyaliteitScherm loyaliteitScherm = new LoyaliteitScherm(totaal, lijst, _tafelnaam, _gebruikersnaam, orderId);
                loyaliteitScherm.Show();
            }
            else
            {
                bool goed = _bonPrinten.BonVoorKlant(_tafelnaam, Convert.ToDouble(0.00));

                if (!goed)
                {
                    MessageBox.Show(@"Er is geen order om te printen!");
                }

                else
                {
                    MessageBox.Show(@"Naar printer verzonden.");
                }

                CheckIfOrder();
            }
        }

        private void buttonFinancieel_Click(object sender, EventArgs e)
        {
            Financieel financieel = new Financieel();
            financieel.ShowDialog();
        }

        private void buttonTerug_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void BestellingOpnemen_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Escape)
            {
                this.Close();
            }
        }

        private void label2_Click(object sender, EventArgs e)
        {

        }
    }
}
